/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package SessionBeans;

import entity.Ciudad;
import entity.InstanciaTransporteServicio;
import entity.Parada;
import entity.TransporteServicio;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.TypedQuery;

/**
 *
 * @author javier
 */
@Stateless
public class InstanciaTransporteServicioFacade extends AbstractFacade<InstanciaTransporteServicio> {
    @PersistenceContext(unitName = "Agencia_de_Turismo_ASPU")
    private EntityManager em;

    protected EntityManager getEntityManager() {
        return em;
    }

    public InstanciaTransporteServicioFacade() {
        super(InstanciaTransporteServicio.class);
    }
     public List<InstanciaTransporteServicio> obtenerInstanciaXTransporteServicio(TransporteServicio transporteServicio, Date fechaInicio, Date fechaFin, Ciudad origen, Ciudad destino ) {
         TypedQuery<InstanciaTransporteServicio> q = em.createQuery("SELECT iTS "
                                                            + "FROM InstanciaTourServicio iTS "
                                                            + "WHERE (iTS.partida BETWEEN :fechaInicio AND :fechaFin )"
                                                            + "AND iTS.transporteServicio = :transporteServicio", InstanciaTransporteServicio.class);
        q.setParameter("fechaFin", fechaFin);
        q.setParameter("fechaInicio", fechaInicio); 
        q.setParameter("transporteServicio", transporteServicio);
        List<InstanciaTransporteServicio> resultados = q.getResultList();
        int posOrigen = this.obtenerPosicionCiudad(origen, transporteServicio);
        int posDestino = this.obtenerPosicionCiudad(destino, transporteServicio);
        for(Iterator<InstanciaTransporteServicio> it = resultados.iterator();it.hasNext();){
            InstanciaTransporteServicio instanciaTransporteServicio = it.next();
            int posOrigenInstancia = this.obtenerPosicionCiudad(instanciaTransporteServicio.getOrigen(), transporteServicio);
            int posDestinoInstancia = this.obtenerPosicionCiudad(instanciaTransporteServicio.getDestino(), transporteServicio);
            if((posOrigenInstancia < posOrigen & posDestinoInstancia < posOrigen) | (posOrigenInstancia > posDestino)){
                resultados.remove(instanciaTransporteServicio);
            }
            
        }
        return resultados;       
    }
         
    public int obtenerPosicionCiudad (Ciudad ciudad, TransporteServicio transporteServicio){
        int pos = 0;
        for (Iterator<Parada> it = transporteServicio.getItinerario().getCiudad().iterator();it.hasNext();){
            pos = pos + 1;
            Ciudad ciu = it.next().getCiudad();
            if (ciu.equals(ciudad)){
                return pos;
            }
        }
        return 0;
    }    
    
    public List<TransporteServicio> obtenerDisponibilidadAsientos(TransporteServicio transporteServicio, Date fechaInicio, Date fechaFin, Ciudad Origen, Ciudad destino){
        List<TransporteServicio> resultados = null;
        List<InstanciaTransporteServicio> instancias = this.obtenerInstanciaXTransporteServicio(transporteServicio, fechaInicio, fechaFin, Origen, destino); 
        //Lunes
        for(Iterator<Date> itLun = transporteServicio.getCronograma().getLunes().iterator(); itLun.hasNext();){
            TransporteServicio transporteServicioNuevo = new TransporteServicio();            
            Date hora = itLun.next();
            transporteServicioNuevo.getCronograma().getLunes().add(hora);
            transporteServicioNuevo.setItinerario(transporteServicio.getItinerario());
            transporteServicioNuevo.setUnidadTransporte(transporteServicio.getUnidadTransporte());
            transporteServicioNuevo.setDescripcion(transporteServicio.getDescripcion());
            transporteServicioNuevo.setNombre(transporteServicio.getNombre());
            transporteServicioNuevo.setId(transporteServicio.getId());
            int cantidad = 0;
            transporteServicioNuevo.getCronograma().getLunes().add(hora);
            for(Iterator<InstanciaTransporteServicio> itIns = instancias.iterator(); itIns.hasNext();){
                InstanciaTransporteServicio instanciaTransporteServicio = itIns.next();
                if(instanciaTransporteServicio.getHorarioPartidaOrigen().equals(hora)){
                    cantidad++;                    
                }                
            }
            cantidad = transporteServicioNuevo.getUnidadTransporte().getModelo().getAsientos() - cantidad;
            transporteServicioNuevo.getUnidadTransporte().getModelo().setAsientos(cantidad);
            resultados.add(transporteServicioNuevo);
        }
        //Martes
        for(Iterator<Date> itMar = transporteServicio.getCronograma().getMartes().iterator(); itMar.hasNext();){
            TransporteServicio transporteServicioNuevo = new TransporteServicio();            
            Date hora = itMar.next();
            transporteServicioNuevo.getCronograma().getLunes().add(hora);
            transporteServicioNuevo.setItinerario(transporteServicio.getItinerario());
            transporteServicioNuevo.setUnidadTransporte(transporteServicio.getUnidadTransporte());
            transporteServicioNuevo.setDescripcion(transporteServicio.getDescripcion());
            transporteServicioNuevo.setNombre(transporteServicio.getNombre());
            transporteServicioNuevo.setId(transporteServicio.getId());
            int cantidad = 0;
            transporteServicioNuevo.getCronograma().getLunes().add(hora);
            for(Iterator<InstanciaTransporteServicio> itIns = instancias.iterator(); itIns.hasNext();){
                InstanciaTransporteServicio instanciaTransporteServicio = itIns.next();
                if(instanciaTransporteServicio.getHorarioPartidaOrigen().equals(hora)){
                    cantidad++;                    
                }                
            }
            cantidad = transporteServicioNuevo.getUnidadTransporte().getModelo().getAsientos() - cantidad;
            transporteServicioNuevo.getUnidadTransporte().getModelo().setAsientos(cantidad);
            resultados.add(transporteServicioNuevo);
        }
        //Miercoles
        for(Iterator<Date> itMie = transporteServicio.getCronograma().getMiercoles().iterator(); itMie.hasNext();){
            TransporteServicio transporteServicioNuevo = new TransporteServicio();            
            Date hora = itMie.next();
            transporteServicioNuevo.getCronograma().getLunes().add(hora);
            transporteServicioNuevo.setItinerario(transporteServicio.getItinerario());
            transporteServicioNuevo.setUnidadTransporte(transporteServicio.getUnidadTransporte());
            transporteServicioNuevo.setDescripcion(transporteServicio.getDescripcion());
            transporteServicioNuevo.setNombre(transporteServicio.getNombre());
            transporteServicioNuevo.setId(transporteServicio.getId());
            int cantidad = 0;
            transporteServicioNuevo.getCronograma().getLunes().add(hora);
            for(Iterator<InstanciaTransporteServicio> itIns = instancias.iterator(); itIns.hasNext();){
                InstanciaTransporteServicio instanciaTransporteServicio = itIns.next();
                if(instanciaTransporteServicio.getHorarioPartidaOrigen().equals(hora)){
                    cantidad++;                    
                }                
            }
            cantidad = transporteServicioNuevo.getUnidadTransporte().getModelo().getAsientos() - cantidad;
            transporteServicioNuevo.getUnidadTransporte().getModelo().setAsientos(cantidad);
            resultados.add(transporteServicioNuevo);
        }
        //Jueves
        for(Iterator<Date> itJue = transporteServicio.getCronograma().getJueves().iterator(); itJue.hasNext();){
            TransporteServicio transporteServicioNuevo = new TransporteServicio();            
            Date hora = itJue.next();
            transporteServicioNuevo.getCronograma().getLunes().add(hora);
            transporteServicioNuevo.setItinerario(transporteServicio.getItinerario());
            transporteServicioNuevo.setUnidadTransporte(transporteServicio.getUnidadTransporte());
            transporteServicioNuevo.setDescripcion(transporteServicio.getDescripcion());
            transporteServicioNuevo.setNombre(transporteServicio.getNombre());
            transporteServicioNuevo.setId(transporteServicio.getId());
            int cantidad = 0;
            transporteServicioNuevo.getCronograma().getLunes().add(hora);
            for(Iterator<InstanciaTransporteServicio> itIns = instancias.iterator(); itIns.hasNext();){
                InstanciaTransporteServicio instanciaTransporteServicio = itIns.next();
                if(instanciaTransporteServicio.getHorarioPartidaOrigen().equals(hora)){
                    cantidad++;                    
                }                
            }
            cantidad = transporteServicioNuevo.getUnidadTransporte().getModelo().getAsientos() - cantidad;
            transporteServicioNuevo.getUnidadTransporte().getModelo().setAsientos(cantidad);
            resultados.add(transporteServicioNuevo);
        }
        //Viernes
        for(Iterator<Date> itVie = transporteServicio.getCronograma().getViernes().iterator(); itVie.hasNext();){
            TransporteServicio transporteServicioNuevo = new TransporteServicio();            
            Date hora = itVie.next();
            transporteServicioNuevo.getCronograma().getLunes().add(hora);
            transporteServicioNuevo.setItinerario(transporteServicio.getItinerario());
            transporteServicioNuevo.setUnidadTransporte(transporteServicio.getUnidadTransporte());
            transporteServicioNuevo.setDescripcion(transporteServicio.getDescripcion());
            transporteServicioNuevo.setNombre(transporteServicio.getNombre());
            transporteServicioNuevo.setId(transporteServicio.getId());
            int cantidad = 0;
            transporteServicioNuevo.getCronograma().getLunes().add(hora);
            for(Iterator<InstanciaTransporteServicio> itIns = instancias.iterator(); itIns.hasNext();){
                InstanciaTransporteServicio instanciaTransporteServicio = itIns.next();
                if(instanciaTransporteServicio.getHorarioPartidaOrigen().equals(hora)){
                    cantidad++;                    
                }                
            }
            cantidad = transporteServicioNuevo.getUnidadTransporte().getModelo().getAsientos() - cantidad;
            transporteServicioNuevo.getUnidadTransporte().getModelo().setAsientos(cantidad);
            resultados.add(transporteServicioNuevo);
        }
        //Sabado
        for(Iterator<Date> itSab = transporteServicio.getCronograma().getSabado().iterator(); itSab.hasNext();){
            TransporteServicio transporteServicioNuevo = new TransporteServicio();            
            Date hora = itSab.next();
            transporteServicioNuevo.getCronograma().getLunes().add(hora);
            transporteServicioNuevo.setItinerario(transporteServicio.getItinerario());
            transporteServicioNuevo.setUnidadTransporte(transporteServicio.getUnidadTransporte());
            transporteServicioNuevo.setDescripcion(transporteServicio.getDescripcion());
            transporteServicioNuevo.setNombre(transporteServicio.getNombre());
            transporteServicioNuevo.setId(transporteServicio.getId());
            int cantidad = 0;
            transporteServicioNuevo.getCronograma().getLunes().add(hora);
            for(Iterator<InstanciaTransporteServicio> itIns = instancias.iterator(); itIns.hasNext();){
                InstanciaTransporteServicio instanciaTransporteServicio = itIns.next();
                if(instanciaTransporteServicio.getHorarioPartidaOrigen().equals(hora)){
                    cantidad++;                    
                }                
            }
            cantidad = transporteServicioNuevo.getUnidadTransporte().getModelo().getAsientos() - cantidad;
            transporteServicioNuevo.getUnidadTransporte().getModelo().setAsientos(cantidad);
            resultados.add(transporteServicioNuevo);
        }
        //Domingo
        for(Iterator<Date> itDom = transporteServicio.getCronograma().getDomingo().iterator(); itDom.hasNext();){
            TransporteServicio transporteServicioNuevo = new TransporteServicio();            
            Date hora = itDom.next();
            transporteServicioNuevo.getCronograma().getLunes().add(hora);
            transporteServicioNuevo.setItinerario(transporteServicio.getItinerario());
            transporteServicioNuevo.setUnidadTransporte(transporteServicio.getUnidadTransporte());
            transporteServicioNuevo.setDescripcion(transporteServicio.getDescripcion());
            transporteServicioNuevo.setNombre(transporteServicio.getNombre());
            transporteServicioNuevo.setId(transporteServicio.getId());
            int cantidad = 0;
            transporteServicioNuevo.getCronograma().getLunes().add(hora);
            for(Iterator<InstanciaTransporteServicio> itIns = instancias.iterator(); itIns.hasNext();){
                InstanciaTransporteServicio instanciaTransporteServicio = itIns.next();
                if(instanciaTransporteServicio.getHorarioPartidaOrigen().equals(hora)){
                    cantidad++;                    
                }                
            }
            cantidad = transporteServicioNuevo.getUnidadTransporte().getModelo().getAsientos() - cantidad;
            transporteServicioNuevo.getUnidadTransporte().getModelo().setAsientos(cantidad);
            resultados.add(transporteServicioNuevo);
        }
        return resultados;
    }
}
